# -*- coding: utf-8 -*-
from django.conf import settings
from django.shortcuts import render, render_to_response, redirect, resolve_url
from django.template import Context, RequestContext
from django.template.response import TemplateResponse
from django.http import HttpResponse, HttpResponseRedirect, QueryDict
from django.contrib.auth import authenticate, login
from django.utils.http import base36_to_int, is_safe_url
from usuarios.forms import *
from usuarios.models import Usuario
from universidades.models import Universidad, Region, Pais_region, Universidad_temp
from universidades.views import sidebar, listarPaises, login
#from django.contrib.auth.models import User
from django.core.mail import send_mail, EmailMessage
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.contrib.auth.models import User, Group
from django.core.urlresolvers import reverse
#from django.contrib.auth.views import password_reset, password_reset_confirm
from django.views.decorators.debug import sensitive_post_parameters
from django.views.decorators.cache import never_cache
from django.contrib.auth.decorators import login_required


#FUNCION QUE AGREGA NUEVOS USUARIOS QUE TIENEN LA INTENCION DE PARTICIPAR DEL PROYECTO.
#SE INSCRIBEN DESDE LA PAGINA PRINCIPAL Y YA TIENE QUE EXISTIR UNA UNIVERSIDAD PARA PODER
#HACERLO.
def agregar(request):
    universidades = Universidad.objects.all()  
    url = request.get_full_path()
    lista_sinc_paises= listarPaises("Universidad")

    if request.method == 'POST':
        form = RegistroForm(request.POST)
        
        if form.is_valid():
            form.save()

            username = request.POST['email']
            user = User.objects.get(username = username)
            user.is_active = False

            user.save()

            context = Context({
                'registro_error': False,
                'registro_valido':True,
                'universidades': universidades,
                'lista_sinc_paises' : lista_sinc_paises,
                'url' : url,
            }) 
            
            context_instance = RequestContext(request)
            return render_to_response('index.html', context,
                              context_instance=context_instance)

        else:
            
            context = Context({
                'registro_error': True,
                'registro_valido':False,
                'universidades': universidades,
                'lista_sinc_paises' : lista_sinc_paises,
                'url' : url,
            }) 
            
            context_instance = RequestContext(request)
            return render_to_response('index.html', context,
                              context_instance=context_instance)

#FUNCION PARA PODER EDITAR LOS DATOS PERSONALES DEL USUARIO
def editar(request):
    url = request.get_full_path()
    error = False
    exito = False
    if not request.user.is_authenticated():
        return redirect('/plataforma')


    if request.method == 'POST':
        
        form = EditarForm(request.POST)
        if form.is_valid():
            form.save()
            exito = True
        else:
            error = True
    
    is_adm_institucional = request.user.groups.filter(
        name='Adm. Institucional').exists()
    user=User.objects.get(pk=request.user.pk)
    menu= sidebar(request)
    context = Context({
        'url': url,
        'is_adm_institucional': is_adm_institucional,
        'pk_user': request.user.pk,
        'error': error,
        'menu': menu,
        'exito': exito,
        'user': user,
    })

    context_instance = RequestContext(request)
    return render_to_response('editar.html', context,
                              context_instance=context_instance)

#FUNCION PARA PODER EDITAR LOS DATOS DE LA UNIVERSIDAD A CARGO DEL ADMIN INSTITUCIONAL.
def editaruniv(request):
    url = request.get_full_path()
    error = False
    exito = False
    is_adm_institucional = request.user.groups.filter(
        name='Adm. Institucional').exists()
    if not is_adm_institucional:
        return redirect('/plataforma')

    if request.method == 'POST':
        form = UnivForm(request.POST)
        if form.is_valid():
            form.save()
            exito = True
        else:
            error = True

    universidad = Universidad.objects.get(administrador_id=request.user.id)
    telefono = ( universidad.telefono ).split( '-' )  # parsear telefono en cod_pais,cod_ciudad, telefono
    menu= sidebar(request)
    context = Context({
        'url': url,
        'universidad': universidad,
        'cod_pais' : telefono[0],
        'cod_ciudad' : telefono[1],
        'telefono' : telefono[2],
        'error': error,
        'menu': menu,
        'exito': exito,
    })

    context_instance = RequestContext(request)
    return render_to_response('editaruniversidad.html', context,
                              context_instance=context_instance)

def ajax_email_verif( request ):
    respuesta = 'NoExiste'
    # Expect an auto 'type' to be passed in via Ajax and POST
    if request.is_ajax() and request.method == 'POST':
        if User.objects.filter( email = request.POST.get('email')).exists():
            if not request.POST.get('email') == '':
                respuesta = 'Existe'
    
    return HttpResponse( respuesta )

#FUNCION PARA VALIDAR LOS NUEVOS USUARIOS QUE QUIEREN INSCRIBIRSE A LA PLATAFORMA,
#BAJO UNA UNIVERSIDAD QUE YA EXISTE
@csrf_exempt ################################################################################################################################################
def validar( request, fila = 0 ):
    url = request.get_full_path()
    universidades = Universidad.objects.all()
    regiones = Region.objects.all()
    user = User.objects.all()

    is_adm_institucional = request.user.groups.filter( name = 'Adm. Institucional' ).exists()

    if not is_adm_institucional:
        return HttpResponse( respuestahttp() )

    menu = sidebar( request )
    context = Context( {
        'url': url,
        'universidades': universidades,
        'regiones' : regiones,
        'menu': menu,
    } )

    info = "Iniciado"
    if request.method == 'POST':

        if savedatos( request, fila ):
            info = "Guardado"
        else:
            info = "Error"

    datos = setdatos( request )
    context.update( {'datos' : datos, } )

    context.update( {'info' : info} )

    context_instance = RequestContext( request )
    return render_to_response( 'validarUser.html', context,
                              context_instance = context_instance )

def setdatos( request ):
    user = User.objects.filter( is_active = 0 )
    universidad = Universidad_temp.objects.all()
    aux = [] #auxiliar para almacenar todos los users que no se registraron junto con una universidad

    #todo lo que obtuvo en user se almacena en la lista aux
    for a in user:
        aux.append(a)
    
    #se verifica si alguno de los users que no estaban activos son administradores de alguna universidad,
    #si es asi, no se los quiere dentro de la variable aux, ya que ellos seran validados en el momento en que se valide a su Universidad.
    #Solo quedan los usuarios que no son administradores de una universidad y no estan activos.
    for univ in universidad:
        for u in aux:
            if u.id == univ.administrador.id:
                aux.remove(u) #se borra al user de la lista
    
    datos = ''

    if len(aux) == 0:
        datos += '<h3>No existen Usuarios para validar en este momento.</h3>'
    else:
        datos += '<p>Seleccione al Usuario que quiere Validar</p>'
        datos += '<table border="0" ALIGN="CENTER" WIDTH="100%" CELLPADDING="10" class="table table-striped">'
        datos += '<tr ALIGN="CENTER">'
        datos += '<th>Nombre y Apellido</th><th>Username</th><th>Aceptar</th><th>Rechazar</th><th></th></tr>' 
        
        
        for u in aux:
            datos += '<form id= "form_' + unicode( u.id ) + '" action="/plataforma/usuarios/validar/' + unicode( u.id ) + '/" method="POST" class="form-horizontal">'
            datos += '<tr ALIGN="CENTER"><td WIDTH="30%">' + unicode( u.last_name ) + ', ' + unicode( u.first_name ) + '</td>'
            datos += '<td ALIGN="CENTER" WIDTH="40%">' + unicode( u.username ) + '</td>'
            datos += '<td WIDTH="10%"><input type="radio" name="_' + unicode( u.id ) + '" value=1 requiere></td>'
            datos += '<td WIDTH="10%"><input type="radio" name="_' + unicode( u.id ) + '" value=0 requiere></td>'
            datos += '<td WIDTH="10%"><center><button type="button" class="btn btn-primary" onClick="checkoption(\'' + unicode( 'form_' + unicode( u.id ) ) + '\',\'_' + unicode( u.id ) + '\')">Validar</button></center></td>'
            datos += '</form></tr>'
                
        datos += '</table>'

    return datos


def savedatos( request, fila ):
    u = User.objects.get( pk = fila )
    grupo_Identificado = Group.objects.get( name = "Identificado" )

    try:
        # Se verifica por medio del id que el checkBox en la columna de aceptacion esta marcado
        if request.POST.has_key( '_' + unicode( u.id ) ):
            if request.POST['_' + unicode( u.id )] == '1':
                # se permite al user el acceso al sistema
                u.is_active = True
                u.save()

                # Se recupera la informacion del User recien creado, para agregarlo a un nuevo grupo
                user_group = User.objects.get( email = u.email )

                # Se le asigna a los grupos Identificado y Adm. Institucional
                grupo_Identificado.user_set.add( user_group )
                recipients = []
                recipients.append(u.email)
                #send_mail(Asunto, mensaje, remitente, destinatario, ... )
                send_mail( 'Solicitud de Inscripción a VinculaEntorno',
                """Felicitaciones!.
                Ha sido aceptado como miembro activo de la plataforma VinculaEntorno. Ahora puede ingresar desde la página principal con su dirección de correo y contraseña.
                Saludos Cordiales.
                Equipo Administrativo.""",
                     'vinculaentorno@uca.edu.py',
                     recipients,
                     fail_silently = False )

            # Se verifica por medio del id que el checkBox en la columna de rechazo esta marcado
            else:
                rechazo = request.POST['mensaje']
                recipients = []
                recipients.append(u.email)
                #send_mail(Asunto, mensaje, remitente, destinatario, ... )
                send_mail( 'Solicitud de Inscripción a VinculaEntorno',
                """Lo sentimos, pero su solicitud ha sido rechazada.
                Los motivos fueron: """ + unicode( rechazo ) + """
                Comuniquese con el emisor de este mensaje.
                Muchas gracias.""",
                     'vinculaentorno@uca.edu.py',
                     recipients,
                     fail_silently = False )
                u.delete()

    except Exception, e:
        print( e )
        return False

    return True
################################################################################################################################################################


#FUNCION PARA ADMINISTRAR LOS USUARIOS QUE YA ESTAN DENTRO DE LA PLATAFORMA, Y DENTRO DE UNA INSTITUCION.
@csrf_exempt ###################################################################################################################################################
def administrar( request, fila = -1 ):
    url = request.get_full_path()
    universidad = Universidad.objects.get(administrador = request.user.id)
    regiones = Region.objects.all()
    user = User.objects.all()

    is_adm_institucional = request.user.groups.filter( name = 'Adm. Institucional' ).exists()

    if not is_adm_institucional:
        return HttpResponse( respuestahttp() )

    menu = sidebar( request )
    context = Context( {
        'url': url,
        'universidad' : universidad,
        'regiones' : regiones,
        'menu': menu,
    } )

    info = "Iniciado"
    if not fila == -1:
        if request.is_ajax():
            if request.POST['activar'] == 1:
                u = User.objects.get(id = fila)
                u.is_active = True
                u.save()

            else:
                u = User.objects.get(id = fila)
                u.is_active = False
                u.save()
        else:
            if savedatosAdmin( request, fila ):
                info = "Guardado"
                #return redirect ("/plataforma/usuarios/administrar/")
            else:
                info = "Error"

    datos = setdatosAdmin( request )
    context.update( {'datos' : datos, } )

    context.update( {'info' : info} )

    context_instance = RequestContext( request )
    return render_to_response( 'adminUser.html', context,
                              context_instance = context_instance )

def setdatosAdmin( request ):
    user = User.objects.filter( is_active = 1 )
    univ = Universidad.objects.get(administrador_id = request.user.id)
    usuarios = Usuario.objects.filter( universidad = univ)

    datos = ''

    if usuarios.count() == 0:
        datos += '<h3>No existen Usuarios para validar en este momento.</h3>'
    else:
        datos += '<p>Seleccione al Usuario que quiere Validar</p>'
        datos += '<table border="0" ALIGN="CENTER" WIDTH="100%" CELLPADDING="10" class="table table-striped">'
        datos += '<tr ALIGN="CENTER">'
        datos += u'<th>Nombre y Apellido</th><th>Username</th><th>¿Está Activo?</th><th></th></tr>' 
        
        for u in usuarios:
            if u.user.email != request.user.email:
                datos += '<form id= "form_' + unicode( u.user.id ) + '" action="/plataforma/usuarios/administrar/' + unicode( u.user.id ) + '/" method="POST" class="form-horizontal">'
                datos += '<tr ALIGN="CENTER"><td WIDTH="30%">' + unicode( u.user.last_name ) + ', ' + unicode( u.user.first_name ) + '</td>'
                datos += '<td ALIGN="CENTER" WIDTH="40%">' + unicode( u.user.username ) + '</td>'
                if u.user.is_active == 1:
                    datos += '<td WIDTH="20%"><input type="checkBox" name="checkbox_' + unicode( u.user.id ) + '" id = "checkbox_' + unicode( u.user.id ) + '" checked requiere onClick="ajax_guardar(\'checkbox_' + unicode( u.user.id ) + '\', \''+unicode(u.user.id)+'\');"></td>'
                else:
                    datos += '<td WIDTH="20%"><input type="checkBox" name="checkbox_' + unicode( u.user.id ) + '" id = "checkbox_' + unicode( u.user.id ) + '" requiere onClick="ajax_guardar(\'checkbox_' + unicode( u.user.id ) + '\', \''+unicode(u.user.id)+'\');"></td>'
                datos += '<td WIDTH="10%"><center><a type="button" class="btn btn-primary" onClick="javascript:eliminar('+ unicode (u.user.id) +')">Eliminar</center></td>'
                datos += '</form></tr>'
                
        datos += '</table>'

    return datos

def savedatosAdmin( request, fila ):
    if not User.objects.filter( pk = fila ).exists():
        return

    u = User.objects.get( pk = fila )
    univ = Universidad.objects.get(administrador_id = request.user.id)
    usuarios = Usuario.objects.filter( universidad = univ)
    flag=False
    
    for a in usuarios:
        print(a.user.id)
        if u.id == a.user.id:
            if u.groups.filter(name = 'Adm. Institucional' ).exists():
                return
            flag=True
    if not flag:
        return

    try:
        recipients = []
        recipients.append(u.email)
        u.delete()

        #send_mail(Asunto, mensaje, remitente, destinatario, ... )
        send_mail( 'Solicitud de Inscripción a VinculaEntorno',
                """Lo Sentimos!.
                Ha sido dado de baja como miembro activo de la plataforma VinculaEntorno. Ahora ya no puede ingresar a la página principal.
                Saludos Cordiales.
                Equipo Administrativo.""",
                'vinculaentorno@uca.edu.py',
                recipients,
                fail_silently = False )
    except Exception, e:
        print( e )
        return False

    return True
################################################################################################################################################################


# 4 views for password reset:
# - password_reset sends the mail
# - password_reset_done shows a success message for the above
# - password_reset_confirm checks the link the user clicked and
#   prompts for a new password
# - password_reset_complete shows a success message for the above

def forgot_password(request):
    if request.method == 'POST':
        return password_reset(request, 
            from_email=request.POST.get('email'))
    else:
        return render(request, 'forgot_password.html')

@csrf_protect
def password_reset(request, is_admin_site=False,
                   template_name='pass_reset_form.html',
                   email_template_name='pass_reset_email.html',
                   subject_template_name='pass_reset_subject.txt',
                   password_reset_form=PasswordResetForm,
                   token_generator=default_token_generator,
                   post_reset_redirect=None,
                   from_email=None,
                   current_app=None,
                   extra_context=None):
    if post_reset_redirect is None:
        post_reset_redirect = reverse('usuarios.views.password_reset_done')
    if request.method == "POST":
        form = password_reset_form(request.POST)
        if form.is_valid():
            opts = {
                'use_https': request.is_secure(),
                'token_generator': token_generator,
                'from_email': from_email,
                'email_template_name': email_template_name,
                'subject_template_name': subject_template_name,
                'request': request,
            }
            if is_admin_site:
                opts = dict(opts, domain_override=request.get_host())
            form.save(**opts)
            return HttpResponseRedirect(post_reset_redirect)
    else:
        form = password_reset_form()
    context = {
        'form': form,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)


def password_reset_done(request,
                        template_name='pass_reset_done.html',
                        current_app=None, extra_context=None):
    context = {}
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)


# Doesn't need csrf_protect since no-one can guess the URL
@sensitive_post_parameters()
@never_cache
def password_reset_confirm(request, uidb36=None, token=None,
                           template_name='pass_reset_confirm.html',
                           token_generator=default_token_generator,
                           set_password_form=SetPasswordForm,
                           post_reset_redirect=None,
                           current_app=None, extra_context=None):
    """
    View that checks the hash in a password reset link and presents a
    form for entering a new password.
    """
    UserModel = get_user_model()
    assert uidb36 is not None and token is not None  # checked by URLconf
    if post_reset_redirect is None:
        post_reset_redirect = reverse('usuarios.views.password_reset_complete')
    try:
        uid_int = base36_to_int(uidb36)
        user = UserModel._default_manager.get(pk=uid_int)
    except (ValueError, OverflowError, UserModel.DoesNotExist):
        user = None

    if user is not None and token_generator.check_token(user, token):
        validlink = True
        if request.method == 'POST':
            form = set_password_form(user, request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect(post_reset_redirect)
        else:
            form = set_password_form(None)
    else:
        validlink = False
        form = None
    context = {
        'form': form,
        'validlink': validlink,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)


def password_reset_complete(request,
                            template_name='pass_reset_complete.html',
                            current_app=None, extra_context=None):
    context = {
        'login_url': reverse('universidades.views.index')
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)


@sensitive_post_parameters()
@csrf_protect
@login_required
def password_change(request,
                    template_name='pass_change_form.html',
                    post_change_redirect=None,
                    password_change_form=PasswordChangeForm,
                    current_app=None, extra_context=None):
    if post_change_redirect is None:
        post_change_redirect = reverse('usuarios.views.password_change_done')
    if request.method == "POST":
        form = password_change_form(user=request.user, data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(post_change_redirect)
    else:
        form = password_change_form(user=request.user)
    context = {
        'form': form,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)


@login_required
def password_change_done(request,
                         template_name='pass_change_done.html',
                         current_app=None, extra_context=None):
    context = {}
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)